
/**
 * instance方法
 * 描述：instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
 * 
 * https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof
 */

console([] instanceof Array);

function myInstanceof(obj, Fun) {
  // 实例的隐式原型
  let proto = obj.__proto__;
  while (proto) {
    // 实例的隐式原型是否等于 构造函数的原型
    if (proto === Fun.prototype) {
      return true
    } else {
      proto = proto.__proto__
    }
  }
}


function myInstanceof1(instance, constructor) {
  // 非引用类型返回false
  if (typeof instance !== 'object' || instance === null || instance === undefined) {
    return false
  }
  // 获取实例的原型
  let prototype = Object.getPrototypeOf(instance);
  while (prototype) {
    // constructor.prototype构造函数的原型
    if (prototype === constructor.prototype) {
      return true
    } else {
      // Object.getPrototypeOf() 静态方法返回指定对象的原型（即内部 [[Prototype]] 属性的值）。
      prototype = Object.getPrototypeOf(prototype)
    }
  }
}

console.log('ww', myInstanceof1({}, Array))  // undefined
console.log('ww', myInstanceof1([], Array)) // true